package genercity;

import org.junit.Test;

/**
 * @Author wangzhipeng
 * @Date 2020-08-14 9:12 上午
 * @Description 演示泛型
 *  定义多个泛型<T,A,B>
 *  对于泛型的使用小技巧：把泛型当做实实在在的类去使用（不准确，也会有很多不同）
 *  擦拭法：编写代码的时候泛型是存在的，真正编译以后泛型是不存在的，底层依据泛型的类型对Object进行了强制转换
 *  使用注意事项：
 *      1. 泛型类是不存在的，比如：Demo<T>类是不存在的，存在的只有Demo类
 *      2. 泛型不能创建对象，比如：Demo<T>，不能使用  T t = new T();
 *      3. 注意方法的重写---会报错
 *
 */
public class Demo<T> {
    private T t2;

    public T getT2(){
        // T t = new T();//报错 因为无法确定有没有无参构造 所以直接不能使用 T泛型不能创建对象
        return t2;
    }

    public void setT2(T t2){
        this.t2 = t2;
    }


    /**
     * 注意复写父类的方法
     * @param args
     * @param t
     */
//    public boolean equals(T t){
//        return this == t;
//    }


    public static void main(String[] args){
        Demo<String> demo = new Demo();
        demo.setT2("xxxx");
        String t2 = (String)demo.getT2();
        System.out.println(t2);
    }

    /**
     * 泛型无法获取的类
     */
    @Test
    public void demo1(){

        Demo<String> d1 = new Demo<>();
        Class<? extends Demo> aClass1 = d1.getClass();
        Demo<Integer> d2 = new Demo<>();
        Class<? extends Demo> aClass2 = d2.getClass();



        System.out.println(aClass1 == aClass2);//true

    }

    /**
     * 无法判断带泛型的类
     */
    @Test
    public void demo2(){
        Demo<String> demo = new Demo<>();

//        if(demo instanceof Demo<String>){//报错
//
//        }



    }



}
